package com.xjrh.traintravel.collector.netty;

import com.xjrh.traintravel.collector.netty.coder.AgreementDecoder;
import io.netty.channel.ChannelInitializer;
import io.netty.channel.ChannelPipeline;
import io.netty.channel.socket.SocketChannel;
import io.netty.handler.codec.LengthFieldBasedFrameDecoder;
import io.netty.handler.timeout.IdleStateHandler;
import org.springframework.stereotype.Component;
import javax.annotation.Resource;
import java.util.concurrent.TimeUnit;

/**
 * Netty服务端初始化
 *
 * @author snps
 * @create 2022-01-17 10:28
 * @describe
 **/
@Component
public class ServerChannelInitializer extends ChannelInitializer<SocketChannel> {

    /**
     * 客户端连接超时时间（超过这个时间没有读写，服务端会断开连接）
     */
    public static final int CLIENT_TIMEOUT_SECOND = 90;

    /**
     * 心跳检测Trigger
     */
    @Resource
    private ServerIdleStateTrigger serverIdleStateTrigger;

    @Resource
    private ServerHandler serverHandler;


    @Override
    protected void initChannel(SocketChannel socketChannel) throws Exception {
        // 增加任务处理
        ChannelPipeline pipeline = socketChannel.pipeline();

        // 设置拆包器
        /*
                65535: 最大接收字节数
                13: 从数据包的第13位开始，获得“数据区域”的长度
                2: “数据区域“的长度
                3: 从”数据区域“向后，增加3个字节的长度。对应协议帧中的：校验(2)，帧尾(1)
         */
        pipeline.addLast(new LengthFieldBasedFrameDecoder(65535, 13, 2, 3, 0));
        // 设置解码器
        pipeline.addLast(new AgreementDecoder());

        // 处理空闲状态事件的处理器
        pipeline.addLast(new IdleStateHandler(CLIENT_TIMEOUT_SECOND,CLIENT_TIMEOUT_SECOND,CLIENT_TIMEOUT_SECOND, TimeUnit.SECONDS));
        // 对空闲检测进一步处理的Handler
        pipeline.addLast(serverIdleStateTrigger);

        // 设置服务消息处理器
        pipeline.addLast(serverHandler);
    }

}